win32: in window_at_pointer, ensure that we handle non-client areas correctly
authorAlexander Larsson <alexl@redhat.com>
Wed, 19 Oct 2011 14:15:17 +0000 (16:15 +0200)
committerAlexander Larsson <alexl@redhat.com>
Thu, 10 Nov 2011 16:40:53 +0000 (17:40 +0100)
We should not return a window if the pointer is in the non-client area,
like the titlebar.

gdk/win32/gdkdevice-win32.c

index 27bf807979ccf24f5a1edf252bf98394ed66c868..09ec36a15043dc2a9de99676ad950626dea89e92 100644 (file)
@@ -384,6 +384,16 @@ gdk_device_win32_window_at_position (GdkDevice       *device,
         screen_to_client (hwnd, screen_pt, &client_pt);
         hwndc = ChildWindowFromPointEx (hwnd, client_pt, CWP_SKIPDISABLED  |
                                                          CWP_SKIPINVISIBLE);
+
+       /* Verify that we're really inside the client area of the window */
+       if (hwndc != hwnd)
+         {
+           GetClientRect (hwndc, &rect);
+           screen_to_client (hwndc, screen_pt, &client_pt);
+           if (!PtInRect (&rect, client_pt))
+             hwndc = hwnd;
+         }
+
       } while (hwndc != hwnd && (hwnd = hwndc, 1));
 
     }
@@ -391,6 +401,12 @@ gdk_device_win32_window_at_position (GdkDevice       *device,
     {
       hwnd = WindowFromPoint (screen_pt);
 
+      /* Verify that we're really inside the client area of the window */
+      GetClientRect (hwnd, &rect);
+      screen_to_client (hwnd, screen_pt, &client_pt);
+      if (!PtInRect (&rect, client_pt))
+       hwnd = NULL;
+
       /* If we didn't hit any window at that point, return the desktop */
       if (hwnd == NULL)
         {
@@ -406,13 +422,10 @@ gdk_device_win32_window_at_position (GdkDevice       *device,
 
   if (window && (win_x || win_y))
     {
-      screen_to_client (hwnd, screen_pt, &client_pt);
-      GetClientRect (hwnd, &rect);
-
       if (win_x)
-        *win_x = client_pt.x - rect.left;
+        *win_x = client_pt.x;
       if (win_y)
-        *win_y = client_pt.y - rect.top;
+        *win_y = client_pt.y;
     }
 
   return window;